package br.gov.sjc.aluguelsocial;

import java.util.List;

import br.gov.sjc.adapter.TrabalhoAdapter;

import br.gov.sjc.classes.NumeroSias;
import br.gov.sjc.classes.Trabalho;
import br.gov.sjc.dao.BaseDAO;
import br.gov.sjc.dao.TrabalhoDAO;

import br.gov.sjc.utils.Sair2;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;

/**
 * 
 * @author rodrigo.ramos
 * @tutorial 
 *           http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda
 *           -de-contatos.html
 */
public class Trabalhomain extends Sair2{
	String TAG = "Trabalhomain";
	private static final int INCLUIR = 0;
	private static final int ALTERAR = 1;
	private TrabalhoDAO lTrabalhoDAO;// inst�ncia responsável pela persist�ncia
	// dos dados
	List<Trabalho> lstTrabalho;// lista de dados cadastrados no BD
	public static TrabalhoAdapter adapter; // Adapter responsável por apresentar
	// os dados na tela

	boolean blnShort = false;
	int Posicao = 0; // determinar a Posição do TrabalhoOFR dentro da lista
	// lstTrabalhoOFR
	// Pega o numero do Sias em uso atual
	NumeroSias ns = new NumeroSias();
	int NumSias = ns.getNumeroDaFamilia();
	int idMembroSias = ns.getNumeroDoMembroDaFamilia();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.trabalho2_lv);
		registerBaseActivityReceiver();
		if (entraNaTela()){
			lTrabalhoDAO = new TrabalhoDAO(this);
			lTrabalhoDAO.open();
			Log.w(TAG.toString(), "lTrabalhoDAO.open();");
			lstTrabalho = lTrabalhoDAO.Consultar(NumSias, idMembroSias);
			Log.w(TAG.toString(), "lTrabalhoDAO.Consultar: " + NumSias + "/"
					+ idMembroSias);
			adapter = new TrabalhoAdapter(this, lstTrabalho);
			Log.w(TAG.toString(),
					" adapter = new TrabalhoAdapter(this, lstTrabalho); ");
			setListAdapter(adapter);
			Log.w(TAG.toString(), " setListAdapter(adapter); ");

			registerForContextMenu(getListView());
			Log.w(TAG.toString(), " setListAdapter(adapter); ");
		}else{
			// Quando for simplesmente cancelar a opera��o de inclusão
			// ou altera��o deve-se apenas informar o RESULT_CANCELED
			// e em seguida finalizar a Activity
			Intent ittTIr = new Intent(getApplicationContext(),
					TrabalhoOFRmain.class);
			setResult(Activity.RESULT_CANCELED);
			startActivity(ittTIr);
			finish();
		}
	}

	public void btnTrabalhoNovo_click(View view) {
		try {
			InserirTrabalho();
		} catch (Exception e) {
			Log.e(TAG, "btnTrabalhoNovo_click - Erro : " + e.getMessage());
		}
	}

	public void btnTrabalhoVoltar_click(View view) {
		try {
			Intent ittTIr = new Intent(getApplicationContext(),
					DocumentosActivity.class);
			setResult(Activity.RESULT_CANCELED);
			startActivity(ittTIr);

			finish();
		} catch (Exception e) {
			Log.e(TAG, "btnTrabalhoVoltar_click - Erro : " + e.getMessage());
		}
	}

	public void btnTrabalhoIr_click(View view) {
		try {
			// Quando for simplesmente cancelar a opera��o de inclusão
			// ou altera��o deve-se apenas informar o RESULT_CANCELED
			// e em seguida finalizar a Activity
			Intent ittTIr = new Intent(getApplicationContext(),
					TrabalhoOFRmain.class);
			setResult(Activity.RESULT_CANCELED);
			startActivity(ittTIr);
			finish();
		} catch (Exception e) {
			Log.e(TAG, "btnTrabalhoIr_click - Erro : " + e.getMessage());
		}
	}

	private boolean entraNaTela(){
		boolean retorno = false;
		SQLiteDatabase BancoDados = null;
		String nomeBanco = BaseDAO.DATABASE_NAME;
		try{
			//File dbFile = new File(Environment.getExternalStorageDirectory(), nomeBanco);
			//BancoDados = SQLiteDatabase.openOrCreateDatabase(dbFile,null);
			BancoDados = openOrCreateDatabase(nomeBanco,MODE_WORLD_READABLE,null);
			Log.v(TAG, "BancoDados.openOrCreateDatabase();");
		}catch (Exception E){
			Log.e(TAG, "Erro em BancoDados.close();"+E.getMessage());
		} 

		try{
			Log.v(TAG, "entraNaTela() Início");
			String SQLQuery = "Select * from tab_DadosPessoais Where SiasN ="+NumSias+" AND idMembro ="+idMembroSias+" AND Trabalha = 'Sim'";
			Cursor Verifica = BancoDados.rawQuery(SQLQuery, null);
			int counter = Verifica.getCount();
			Verifica.moveToFirst();
			if ( counter !=0 ){
				retorno = true;
				Log.i(TAG, "entraNaTela() !=0  e counter="+counter);
			}else{
				Log.e(TAG, "Erro: Verifica.getCount() =0 e counter="+counter);
			}
		}catch (Exception Err){
			Log.e(TAG, "Erro: "+Err.getMessage());
		}

		BancoDados.close();
		Log.v(TAG, "BancoDados.close();");

		return retorno;

	}

	// Rotina executada quando finalizar a Activity TrabalhoAct
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Trabalho lTrabalho = null;

		try {
			super.onActivityResult(requestCode, resultCode, data);
			if (resultCode == Activity.RESULT_OK) {
				// obtem dados inseridos/alterados na Activity trabalho
				lTrabalho = (Trabalho) data.getExtras().getSerializable(
						"trabalho");

				Log.w(TAG.toString(), " INCLUIR == " + INCLUIR);

				// o valor do requestCode foi definido na fun��o
				// startActivityForResult
				if (requestCode == INCLUIR) {
					// verifica se digitou algo no valor
					if (!lTrabalho.getRendimento().equals("")) {
						// necessário abrir novamente o BD pois ele foi fechado
						// no método onPause()
						lTrabalhoDAO.open();

						// insere o contato no Banco de Dados SQLite
						lTrabalhoDAO.inserir(lTrabalho);

						// insere o contato na lista de contatos em mem�ria
						lstTrabalho.add(lTrabalho);
					}
					Log.w(TAG.toString(), " ALTERAR == " + ALTERAR);

				} else if (requestCode == ALTERAR) {
					lTrabalhoDAO.open();
					// atualiza o contato no Banco de Dados SQLite
					lTrabalhoDAO.alterar(lTrabalho);

					// atualiza o contato na lista de contatos em mem�ria
					lstTrabalho.set(Posicao, lTrabalho);
				}

				// método responsável pela atualiza da lista de dados na tela
				adapter.notifyDataSetChanged();
			}
		} catch (Exception e) {
			Log.w(TAG.toString(), "Exception ALTERAR == " + ALTERAR);
			Log.w(TAG.toString(), "Exception INCLUIR == " + INCLUIR);

			Log.e(TAG, "onActivityResult - Erro : " + e.getMessage());
		}
	}

	private void InserirTrabalho() {
		try {
			// a vari�vel "tipoT" tem a fun��o de definir o comportamento da
			// Activity
			// ContatoUI, agora a vari�vel tipo está definida com o valor "0"
			// para
			// informar que ser� uma inclusão de Contato

			Intent it = new Intent(this, TrabalhoActivity.class);
			it.putExtra("tipoT", INCLUIR);
			startActivityForResult(it, INCLUIR);// chama a tela e inclusão
			Log.w(TAG, "startActivityForResult INCLUIR == " + INCLUIR);
		} catch (Exception e) {
			Log.e(TAG, "InserirTrabalho - Erro : " + e.getMessage());
		}
	}

	@Override
	protected void onResume() {
		// quando a Activity main receber o foco novamente abre-se novamente a
		// conexão
		lTrabalhoDAO.open();
		// método responsável pela atualiza da lista de dados na tela
		adapter.notifyDataSetChanged();
		super.onResume();
	}

	@Override
	protected void onPause() {
		// toda vez que o programa peder o foco fecha-se a conexão com o BD
		lTrabalhoDAO.close();
		super.onPause();
	}

	@Override
	public void onCreateContextMenu(ContextMenu menuT, View v,
			ContextMenuInfo menuInfoT) {
		try {
			// Criação do popup menu com as op��es que termos sobre
			// nossos TRABALHOS

			AdapterView.AdapterContextMenuInfo infoT = (AdapterView.AdapterContextMenuInfo) menuInfoT;
			if (!blnShort) {
				Posicao = infoT.position;
			}
			blnShort = false;
			Log.w(TAG, "onCreateContextMenu Posicao:" + Posicao);
			menuT.setHeaderTitle("Selecione:");
			// a origem dos dados do menu está definido no arquivo arrays.xml
			String[] menuTItems = getResources().getStringArray(R.array.menu);
			for (int i = 0; i < menuTItems.length; i++) {
				menuT.add(Menu.NONE, i, i, menuTItems[i]);
			}
			Log.w(TAG, "onCreateContextMenu Terminou");

		} catch (Exception e) {
			Log.e(TAG, "onCreateContextMenu - Erro : " + e.getMessage());
		}
	}

	// Este método � disparado quando o usu�rio clicar em um item do ContextMenu
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		Trabalho ltrabalho = null;
		try {
			int menuItemIndex = item.getItemId();

			// Carregar a inst�ncia POJO com a Posição selecionada na tela
			ltrabalho = (Trabalho) getListAdapter().getItem(Posicao);

			if (menuItemIndex == 0) {
				// Carregar a Activity ContatoUI com o registro selecionado na
				// tela

				Intent it = new Intent(this, TrabalhoActivity.class);
				it.putExtra("tipoT", ALTERAR);
				it.putExtra("trabalho", ltrabalho);
				startActivityForResult(it, ALTERAR); // chama a tela de
				// altera��o
				// método responsável pela atualiza da lista de dados na tela
				adapter.notifyDataSetChanged();
			} else if (menuItemIndex == 1) {
				// Excluir do Banco de Dados e da tela o registro selecionado

				lTrabalhoDAO.Excluir(ltrabalho);
				lstTrabalho.remove(ltrabalho);
				adapter.notifyDataSetChanged(); // atualiza a tela
			}
		} catch (Exception e) {
			Log.e(TAG, "Erro : " + e.getMessage());
		}
		return true;
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		try {
			Log.w(TAG, "onListItemClick position:" + position + " id:" + id
					+ " v:" + v.toString());
			super.onListItemClick(l, v, position, id);
			// por padr�o o ContextMenu, s� � executado atrav�s de LongClick,
			// mas
			// nesse caso toda vez que executar um ShortClick, abriremos o menu
			// e tamb�m guardaremos qual a Posição do itm selecionado

			Posicao = position;
			blnShort = true;
			this.openContextMenu(l);
		} catch (Exception e) {
			Log.e(TAG,
					"onListItemClick ERRO :" + e.getMessage() + "/"
							+ e.getCause());

		}
		Log.i(TAG, "onListItemClick fim");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unRegisterBaseActivityReceiver();
	}
}
